// 泛型，字符代表任意类型（但可以通过继承增加约束）

// 函数示例
// function join<T, P>(first: T, second: P) {}
// join<number, string>(1, "2");

// 类示例
// class SelectGirl<T> {
//   constructor(private girls: T[]) {}
//   getGirl(index: number): T {
//     return this.girls[index];
//   }
// }
// const selectGirl = new SelectGirl<string>(["大脚", "刘英", "晓红"]);
// console.log(selectGirl.getGirl(1));

// 泛型的约束
// 函数示例，泛型继承联合类型
// type uType = string | number;
// function saySomething<T extends uType>(arg: T) {
//   console.log(arg);
// }
// saySomething(1);

// 泛型的约束
// 类示例，泛型继承接口
// interface Girl {
//   name: string;
// }
// class ObjType implements Girl {
//   name: string;
//   age: number;
//   constructor(name: string, age: number) {
//     this.name = name;
//     this.age = age;
//   }
// }
// class SelectGirl<T extends Girl> {
//   constructor(private girls: T[]) {}
//   getGirl(index: number): string {
//     return this.girls[index].name;
//   }
// }
// const selectGirl = new SelectGirl<ObjType>([
//   { name: "大脚", age: 18 },
//   { name: "刘英", age: 18 },
//   { name: "晓红", age: 18 },
// ]);
// console.log(selectGirl.getGirl(1));
